#include <iostream>
#include "forme.h"
#include <vector>
#include <string>

using namespace std;


// PROGRAMME PRINCIPAL

int main (int argc, const char * argv[])
{

    
    // Variables globales
    objet_base *tabObjet[100];
    int nbObjet=0;
    int idFigure=1;
    
    // Variables choix menu
    int chxMenu;
    int chxCrea;
    
    point2D tabPt[10];
    

    
// #####################################################################################################
//                                      MENU PRINCIPAL
// #####################################################################################################
    
// Etiquette    
menuPrincipal:
    
    while(chxMenu<1 || chxMenu>4)
    {
        cout << "################################ MENU ################################" << endl;
        cout << "# 1. Créer objet                                                     #" << endl;
        cout << "# 2. Translation objet de base/objet composite                       #" << endl;
        cout << "# 3. Afficher objet	                                              #" << endl;
        cout << "# 4. Quitter programme                                               #" << endl;
        cout << "######################################################################" << endl;
        cout << "Votre choix: ";
        
        cin >> chxMenu;
    }
    
    
// #####################################################################################################
//                                      MENU CREATION
// #####################################################################################################
    if(chxMenu==1)
    {
        while(chxCrea<1 || chxCrea >7)
        {
            cout << "########################### Creation objet ###########################" << endl;
            cout << "# 1. Créer segment                                                   #" << endl;
            cout << "# 2. Créer triangle                                                  #" << endl;
            cout << "# 3. Créer rectangle                                                 #" << endl;
            cout << "# 4. Créer cercle                                                    #" << endl;
            cout << "# 5. Créer arc de cercle                                             #" << endl;
            cout << "# 6. Créer ellipse                                                   #" << endl;
            cout << "# 7. Créer multi-segment                                             #" << endl;
            cout << "# 8. Créer portion de disque                                         #" << endl;
            cout << "# 9. Créer objet composite                                           #" << endl;
            cout << "######################################################################" << endl;
            cout << "Votre choix: ";
            
            cin >> chxCrea;
        }
        
        // ####################### Création segment #######################
        if(chxCrea==1)
        {
            cout << "Creation segment\n";
            // Variables de création
            int x, y, l;
            
            // Saisie point origine
            cout << "Saisir point origine\nx: ";
            cin >> x;
            cout << "y: ";
            cin >> y;
            
            // Saisie longueur
            cout << "Saisir longueur: ";
            cin >> l;
            
            // Appel constructeur
            point2D p1(x, y);
            segment s1(l, p1, idFigure, 1);
            
            // Enregistrement de la figure en mémoire
            tabObjet[nbObjet]=&s1;
        }
        
        // ####################### Création triangle #########################
        else if(chxCrea==2)
        {
            cout << "Creation triangle\n";
            // Variables de création
            int x, y, x2, y2, x3, y3;
            
            // Saisie point origine
            cout << "Saisir point origine\nx: ";
            cin >> x;
            cout << "y: ";
            cin >> y;
            
            // Saisie coté
            cout << "Saisir deuxième point: ";
            cin >> x2;
			cout << "y: ";
			cin >> y2;
           
			cout << "Saisir troisième point: ";
            cin >> x3;
			cout << "y: ";
			cin >> y3;
 
            // Appel constructeur
            point2D p1(x, y);
			point2D p2(x, y);
			point2D p3(x, y);
            triangle t1(p1, p2, p3, idFigure, 2);
            
            // Enregistrement de la figure en mémoire
            tabObjet[nbObjet]=&t1;
        }
        
        // ###################### Création rectangle ######################
        else if(chxCrea==3)
        {
            // Variables de création
            int x, y, x2, y2;
            
            // Saisie point origine
            cout << "Saisir point origine\nx: ";
            cin >> x;
            cout << "y: ";
            cin >> y;
            
            // Saisie point bas droite
            cout << "Saisir point bas droit\nx: ";
            cin >> x2;
            cout << "y: ";
            cin >> y2;
            
            // Appel constructeur
            point2D p1(x, y);
            point2D p2(x2, y2);
            rectangle r1(p1, p2, idFigure, 3);
            
            // Enregistrement de la figure en mémoire
            tabObjet[nbObjet]=&r1;
        }
        
        // ######################## Création cercle #######################
        else if(chxCrea==4)
        {
            // Variables de création
            int x, y, r;
            
            // Saisie point origine
            cout << "Saisir point origine\nx: ";
            cin >> x;
            cout << "y: ";
            cin >> y;
            
            // Saisie rayon
            cout << "Saisir rayon: ";
            cin >> r;
            
            // Appel constructeur
            point2D p1(x, y);
            cercle cer1(r, p1, idFigure, 4);
            
            // Enregistrement de la figure en mémoire
            tabObjet[nbObjet]=&cer1;
        }
        
        // #################### Création arc de cercle ####################
        else if(chxCrea==5)
        {
            // Variables de création
            int x, y, r, a1, a2;
            
            // Saisie point origine
            cout << "Saisir point origine\nx: ";
            cin >> x;
            cout << "y: ";
            cin >> y;
            
            // Saisie rayon
            cout << "Saisir rayon: ";
            cin >> r;
            
            // Saisie angle1
            cout << "Saisir angle1: ";
            cin >> a1;
            
            // Saisie angle2
            cout << "Saisir angle2: ";
            cin >> a2;
            
            // Appel constructeur
            point2D p1(x, y);
            arc_cercle ac1(r, a1, a2, p1, idFigure, 5);
            
            // Enregistrement de la figure en mémoire
            tabObjet[nbObjet]=&ac1;
        }
        
        // ####################### Création disque  #######################
        else if(chxCrea==6)
        {
            // Variables de création
            int x, y, x2, y2, r, r2;
            
            // Saisie point origine
            cout << "Saisir point origine\nx: ";
            cin >> x;
            cout << "y: ";
            cin >> y;
            
            // Saisie point origine
            cout << "Saisir centre 2\nx: ";
            cin >> x2;
            cout << "y: ";
            cin >> y2;
            
            // Saisie rayon 1
            cout << "Saisir rayon 1: ";
            cin >> r;
            
            // Saisie rayon 2
            cout << "Saisir rayon 2: ";
            cin >> r2;
            
            // Appel constructeur
            point2D p1(x, y);
            point2D p2(x2, y2);
            disque d1(p2, r2, r, p1, idFigure, 6);
            
            // Enregistrement de la figure en mémoire
            tabObjet[nbObjet]=&d1;
        }
              
        // #################### Création multi segment ####################
        else if(chxCrea==7)
        {
            int i, nbSeg;
            cout << "Nombre de segments : ";
            cin >> nbSeg;
            
            segment tabSeg[10];
            
            for(i=0; i<nbSeg; i++)
            {
                cout << "Segment " << i+1 << ": " << endl;
                
                // Variables de création
                int x, y, l;
                
                // Saisie point origine
                cout << "Saisir point origine\nx: ";
                cin >> x;
                cout << "y: ";
                cin >> y;
                
                // Saisie longueur
                cout << "Saisir longueur: ";
                cin >> l;
                
                // Appel constructeur
                point2D p1(x, y);
                segment s1(l, p1, idFigure, 7);
                
                tabSeg[i]=s1;
                
            }
            
            // Enregistrement de la figure en mémoire
            multi_segment ms1(tabSeg, nbSeg);
            tabObjet[nbObjet]=&ms1;
           
        }
        
        // ################### Création objet composite ###################
        else if(chxCrea==8)
        {
            // A FAIRE
        }
        
        nbObjet++;
        idFigure++;
    
    }

// #####################################################################################################
//                                      MENU AFFICHAGE
// #####################################################################################################
    
    if(chxMenu==2)
    {
        // Variables
        int chxId;
        int i;
        
        cout << "########################### Modifier objet ##########################" << endl;
        cout << "################################ Objet ##############################" << endl;
        
        for(i=0; i<nbObjet; i++)
        {
            string type;
            
            switch(tabObjet[i]->getType())
            {
                case 1: type="segment"; break;
                case 2: type="carré"; break;
                case 3: type="rectangle"; break;
                case 4: type="cercle"; break;
                case 5: type="arc_cercle"; break;
                case 6: type="ellipse"; break;
                default: break;
            }
            
            cout << tabObjet[i]->getId() << "- " << type << " | "; tabObjet[i]->affiche();
        }
        
        if (nbObjet>0)
		{
			cout << "\nEntrer l'identifiant de votre forme: ";
			cin >> chxId;
        
			// Fonction de motidication
        
			tabObjet[chxId-1]->translation();
        
			cout << endl;
		}
		else
			cout << "\nVous n'avez pas créé d'objet !" << endl;
    }
    
// #####################################################################################################
//                                      MENU AFFICHAGE
// #####################################################################################################
    
    if(chxMenu==3)
    {     
        cout << "########################### Objet ##########################" << endl;
        
        int i;
        
        for(i=0; i<nbObjet; i++)
        {
            string type;
            
            switch(tabObjet[i]->getType())
            {
                case 1: type="segment"; break;
                case 2: type="carré"; break;
                case 3: type="rectangle"; break;
                case 4: type="cercle"; break;
                case 5: type="arc_cercle"; break;
                case 6: type="ellipse"; break;
                case 7: type="multi-segment"; break;
                default: break;
            }
            
            cout << tabObjet[i]->getId() << "- " << type << " | "; tabObjet[i]->affiche();
        }
		if(nbObjet==0)
			{
				cout << " \nil n'y a pas d'objet à afficher" << endl;
			}
        
    }
    
    
// #####################################################################################################
//                                      QUITTER
// #####################################################################################################
    
    if(chxMenu==4)
    {
        return 0;
    }
    
// #####################################################################################################
//                                  RETOUR VERS MENU PRINCIPAL
// #####################################################################################################
    
    // RAZ chxMenu
    chxMenu=0;
    chxCrea=0;
    
    
    goto menuPrincipal;
    
    
}

